/**
 * 财务报表服务实现类 - 处理财务文档上传和AI分析的核心业务逻辑
 *
 * 开发人员：马勇俐
 * 开发时间：2025-11-16 至 2025-11-20
 * 模块职责：实现财务报表的上传、状态管理、AI分析结果保存等核心业务逻辑，与AI分析服务协同工作
 *
 * 技术要点：
 * - 财务文档上传和存储管理
 * - AI分析状态流转和控制机制
 * - 分析结果保存和错误处理逻辑
 * - 多租户文档数据隔离和管理
 * - 异常处理和事务管理机制
 *
 * 开发故事：负责财务报表服务的核心业务逻辑实现，与报表控制器和AI分析服务深度配合，为企业提供专业的财务文档智能分析服务。
 */
package com.pbl.service.impl;

import com.pbl.common.enums.FinanceReportStatus;
import com.pbl.common.exception.BizException;
import com.pbl.entity.Enterprise;
import com.pbl.entity.FinanceReport;
import com.pbl.entity.User;
import com.pbl.repository.EnterpriseRepository;
import com.pbl.repository.FinanceReportRepository;
import com.pbl.repository.UserRepository;
import com.pbl.service.ReportService;
import org.springframework.stereotype.Service;

@Service
public class ReportServiceImpl implements ReportService {

    private final FinanceReportRepository financeReportRepository;
    private final EnterpriseRepository enterpriseRepository;
    private final UserRepository userRepository;

    /**
     * 构造财务报表服务实现
     * @param financeReportRepository 财务报表数据访问层
     * @param enterpriseRepository 企业数据访问层
     * @param userRepository 用户数据访问层
     */
    public ReportServiceImpl(FinanceReportRepository financeReportRepository, EnterpriseRepository enterpriseRepository, UserRepository userRepository) {
        this.financeReportRepository = financeReportRepository;
        this.enterpriseRepository = enterpriseRepository;
        this.userRepository = userRepository;
    }

    @Override
    public FinanceReport createUpload(Long enterpriseId, Long userId, String fileName, String fileType, int fileSize, String storageUrl) {
        Enterprise ent = enterpriseRepository.findById(enterpriseId).orElseThrow(() -> new BizException(404, "企业不存在"));
        User user = userRepository.findById(userId).orElse(null);
        FinanceReport fr = new FinanceReport();
        fr.setEnterprise(ent);
        fr.setUploadedByUser(user);
        fr.setFileName(fileName);
        fr.setFileType(fileType);
        fr.setFileSize(fileSize);
        fr.setStorageUrl(storageUrl);
        fr.setStatus(FinanceReportStatus.UPLOADED);
        return financeReportRepository.save(fr);
    }

    @Override
    public FinanceReport markAnalyzing(Long id) {
        FinanceReport fr = financeReportRepository.findById(id).orElseThrow(() -> new BizException(404, "报表不存在"));
        fr.setStatus(FinanceReportStatus.ANALYZING);
        return financeReportRepository.save(fr);
    }

    @Override
    public FinanceReport saveAnalysis(Long id, String analysisJson, boolean success) {
        FinanceReport fr = financeReportRepository.findById(id).orElseThrow(() -> new BizException(404, "报表不存在"));
        fr.setAnalysis(analysisJson);
        fr.setStatus(success ? FinanceReportStatus.DONE : FinanceReportStatus.FAILED);
        return financeReportRepository.save(fr);
    }
}
